/***************************************************
 * @Author: OBKoro1
 * @Create: 2020-03-27
 * @LastEditors: OBKoro1
 * @LastEditTime: 2020-03-27
 * @FilePath: \leetcode-exercise\179-最大数\179.c
 ****************************************************/
// 数值反转
int reverse(int a)
{
    int temp = a;
    int res = 0;
    while (temp > 0)
    {
        res = temp % 10 + res * 10;
        temp /= 10;
    }
    return res;
}

// 定制的大小比对规则(9 > 10 首位数字越大， 372 > 3712)
// 实际上10 应该比1小，因为组成的110比101大
bool Comparison(int a, int b)
{
    //从高位数值开始对齐比较
    int reverse_a;
    int reverse_b;
    reverse_a = reverse(a);
    reverse_b = reverse(b);
    // 如果反转系数都相等的情况下需要仔细考虑10，1这场景
    if (reverse_a == reverse_b)
    {
        if (a > b)
        {
            return false;
        }
        else
        {
            return true;
        }
    }

    while ((reverse_a > 0) && (reverse_b > 0))
    {
        if ((reverse_a % 10) > (reverse_b % 10))
        {
            return true;
        }
        else if ((reverse_a % 10) < (reverse_b % 10))
        {
            return false;
        }
        else
        {
            reverse_a /= 10;
            reverse_b /= 10;
        }
    }
    // 默认返回false
    if (reverse_a > reverse_b)
    {
        return true;
    }
    else
    {
        return false;
    }
}
// 冒泡排序
void BubbleSort(int *arr, int size)
{
    int i;
    int j;
    int temp;
    for (i = 0; i < size; i++)
    {
        for (j = 1; j < size - i; j++)
        {
            // 冒泡排序最大往前挪,最小的往后靠
            if (Comparison(arr[j - 1], arr[j]) == false)
            {
                temp = arr[j - 1];
                arr[j - 1] = arr[j];
                arr[j] = temp;
            }
        }
    }
    return;
}

#define MAX_BUF 1000
#define BUF 10
char *largestNumber(int *nums, int numsSize)
{
    int i;
    char *res;
    char *tmp;
    tmp = (char *)malloc(sizeof(char) * BUF);
    res = (char *)malloc(sizeof(char) * MAX_BUF);
    memset(res, 0, sizeof(char) * MAX_BUF);
    // 1.首先对 nums数组种元素进行排序
    BubbleSort(nums, numsSize);
    // 2.将排序后的数组元素组成字符串返回输出
    for (i = 0; i < numsSize; i++)
    {
        // 将数值转化成字符串
        sprintf_s(tmp, BUF, "%d", nums[i]); //sprintf将文本写入到字符串中
        strcat_s(res, MAX_BUF, tmp);        // 使用strcat追加字符串
    }
    return res;
}